Подключение метода /api/v1/auth/logout на API-Шлюзе
Маршрутизация HTTP-запроса, вызов gRPC-клиента Auth и управление пулом активных WebSocket-соединений.
NoteКраткая карточка задачи
- Репозиторий / Компонент:
backend-api(API Gateway / Шлюз). - Категория: Подключение метода к шлюзу.
- Контракт взаимодействия: Внешний
POST /api/v1/auth/logout-> Внутренний gRPCAuthService.LogoutUser. - Спецификация gRPC контракта: См. Раздел: Protobuf Контракт
- Статус: Готово к реализации
Предварительные условия (Prerequisites):
- Убедиться, что клиентские gRPC-стабы (stubs) для сервиса
AuthServiceуспешно сгенерированы и обновлены в зависимостях репозитория шлюза на основе актуального Protobuf Контракта.
- Убедиться, что клиентские gRPC-стабы (stubs) для сервиса
Инструкция по шагам:
- На Шаге 2 (Прием и роутинг запроса): Зарегистрировать внешний HTTP-маршрут
POST /api/v1/auth/logout. Настроить Pydantic/DTO валидацию тела запроса для извлечения обязательного поляrefresh_token. Обеспечить сквозное логирование по заголовкуX-Request-ID. - На Шаге 3 (gRPC-клиент): Извлечь строковый
Access Tokenиз заголовкаAuthorization: Bearer <token>. Распаковать его в памяти шлюза (без похода в БД) для полученияuser_id. Сформировать gRPC-сообщениеLogoutRequest, передав в негоuser_idиrefresh_token, и направить вызов вauth-service. - Обработка системных статусов: Реализовать перехват gRPC-ошибок от бэкенда. Если
auth-serviceвозвращаетINVALID_ARGUMENT, транслировать её клиенту какHTTP 400 Bad Request. Если возвращается ошибка Fail-Close (ошибка блэклиста Redis), корректно отдавать клиентуHTTP 503 Service Unavailable. - На Шаге 7 (Управление WebSocket-стримом): При получении от бэкенда успешного ответа
LogoutResponse (success: true), обратиться к внутреннему менеджеру соединений шлюза (WebSocket Connection Manager). По полученному ранееuser_idидентифицировать активную сессию WSS-стрима (/ws/push-stream/{id}) конкретно для данного устройства и принудительно вызвать методstream.close(code=1000, reason="SESSION_TERMINATED"). - Финальный ответ: Сформировать успешный HTTP-ответ
200 OKсо строгим соответствием JSON-структуры успешного завершения сессии (SESSION_TERMINATED).
- На Шаге 2 (Прием и роутинг запроса): Зарегистрировать внешний HTTP-маршрут